/**
 * 游戏状态：Main（主界面状态）
 * 
 * 功能说明：
 * - 游戏的主界面状态，用户登录后的主要游戏界面
 * - 加载主场景，显示游戏主界面
 * - 处理主界面的各种功能入口
 * - 管理游戏的核心功能模块
 * 
 * 设计模式：
 * - 状态模式 (State Pattern)
 * - 继承自BaseState<GameApp>
 * 
 * 生命周期：
 * 1. Enter(): 进入主界面状态，加载主场景和UI
 * 2. Update(): 处理主界面逻辑和用户交互
 * 3. Exit(): 退出主界面状态，清理资源
 * 
 * 工作流程：
 * 1. 异步加载Main场景
 * 2. 显示主界面UI面板
 * 3. 卸载之前的场景
 * 4. 初始化主界面功能
 * 
 * 使用场景：
 * - 游戏主菜单
 * - 功能模块入口
 * - 玩家信息显示
 * - 游戏设置
 * - 社交功能
 */

using Game;
using Game.UI;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

namespace GameStates
{
    /**
     * 主界面游戏状态
     * 
     * 负责处理游戏主界面的所有逻辑
     * 包括场景加载、UI显示、功能模块管理等
     */
    public class GameStateMain : BaseState<GameApp>
    {
        /**
         * 进入主界面状态
         * 
         * 功能：
         * - 状态被激活时调用
         * - 异步加载主场景
         * - 显示主界面UI面板
         * - 初始化主界面功能
         * 
         * 工作流程：
         * 1. 启动异步场景加载协程
         * 2. 加载Main场景（叠加模式）
         * 3. 显示UIMainPanel
         * 4. 卸载之前的场景
         * 
         * 设计说明：
         * - 使用协程处理异步操作，避免阻塞主线程
         * - 采用叠加模式加载场景，确保UI显示正常
         * - 加载完成后再卸载旧场景，保证平滑过渡
         */
        public override void Enter()
        {
            Debug.Log("GameStateMain: 进入Main状态 - 加载主场景");

            // 注释掉的代码展示了直接加载方式
            // 直接调用场景加载（同步方式）
            // UIManager.Instance.ShowPanel("UIMainPanel", (panel) => {
            //     SceneManager.LoadScene("Main");    
            // });

            // 使用协程异步加载场景和UI
            GameApp.Instance.StartCoroutine(LoadSceneAsync("Main"));
        }

        /**
         * 异步加载场景的协程方法
         * 
         * 功能：
         * - 异步加载指定场景
         * - 加载完成后显示主界面UI
         * - 卸载之前的场景
         * 
         * 参数：
         * - sceneName: 要加载的场景名称
         * 
         * 工作流程：
         * 1. 保存当前场景名称
         * 2. 异步加载新场景（叠加模式）
         * 3. 等待场景加载完成
         * 4. 异步显示主界面UI面板
         * 5. 等待UI显示完成
         * 6. 卸载之前的场景
         * 
         * 设计优势：
         * - 避免场景切换时的卡顿
         * - 确保UI和场景的加载顺序正确
         * - 提供更好的用户体验
         */
        private IEnumerator LoadSceneAsync(string sceneName)
        {
            // 保存当前场景名称，用于后续卸载
            var currentScene = SceneManager.GetActiveScene().name;

            // 异步加载新场景（叠加模式，不销毁当前场景）
            var asyncOperation = SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive);
            yield return asyncOperation;

            // 异步显示主界面UI面板
            var operation = UIManager.Instance.ShowPanelAsync("UIMainPanel");
            yield return operation;

            // 卸载之前的场景，释放内存
            SceneManager.UnloadSceneAsync(currentScene);
        }

        /**
         * 退出主界面状态
         * 
         * 功能：
         * - 状态被切换时调用
         * - 清理主界面相关资源
         * - 隐藏主界面UI
         * - 准备切换到下一个状态
         * 
         * 当前实现：
         * - 输出调试日志
         * 
         * 扩展建议：
         * - 隐藏主界面UI面板
         * - 保存主界面状态
         * - 清理临时资源
         * - 停止主界面相关的定时器
         */
        public override void Exit()
        {
            Debug.Log("GameStateMain: 退出Main状态 - 清理主界面资源");
            
            // 扩展建议：
            // 1. 隐藏主界面UI面板
            // 2. 保存用户在主界面的操作状态
            // 3. 清理主界面相关的临时资源
            // 4. 停止主界面相关的协程和定时器
            // 5. 记录主界面停留时间
        }
    }
}
